解决 Django 部署完成后丢失样式文件的问题

这里 记录了在服务器上使用 NginxuWSGI 部署 Django 的过程。虽然网站可以访问,但是,最样式文件没能正确加载。 经过不断查找,最终成功加载,网站可以正常访问。

在这里记录一下,导致样式等静态文件不能加载的原因。

所有操作,通篇阅读后,按需执行。



一、Nginx 没有配置静态文件

解决方法:在 Nginx 的配置文件中添加正确的静态文件目录。具体过程如下

首先,要确保 DjangoSettings.py 中正确配置 STATIC_URL,这个变量的值是项目放静态文件的目录。一般是在项目根目录下新建 static 目录,设置 STATIC_URL="/static/",这里也是用这种方法。

峰哥[1]的教程里的第九讲还说了一种,就是在每个 APP 下建个 static 目录,这个 APP 的所有静态文件都放这里,然后 Settings.py 里设置 STATICFILES_DIRS,这种方法没试,毕竟我这个项目很小,不用那么麻烦。

言归正传,配置好 STATIC_URL 后,配置 Nginx 的静态文件路径。进入 /etc/nginx/sites-available 修改 default 配置文件,在 location / 字段下添加 location /static 字段,如下

location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		# try_files $uri $uri/ =404;
		include uwsgi_params;
		uwsgi_pass 127.0.0.1:8080;
		uwsgi_param UWSGI_CHDIR /home/breky/Workspace/djangodemo/Retrieve;
		uwsgi_param UWSGI_SCRIPT Retrieve.wsgi;
		client_max_body_size 35m;
	}
location /static {
		alias /home/breky/Workspace/djangodemo/Retrieve/static;
	}

alias 后跟的是 static 目录的绝对路径。注意结尾有分号。

重启 nginx,再访问网站。嗯,还不行。查看页面源代码,点击 css 的链接,nginx 给的提示是 403 Forbidden。也就是说,网站找到了文件,但是不给访问。解决方法转下个问题。

二、nginx 提示是 403 Forbidden

这个提示是 nginx 找到了静态文件,但是不给访问。也就是权限问题。需要修改 nginx 的访问权限。

10 Django 使用 uWSGI 和 Nginx 部署中说过,uWSGI 服务配置文件中的 User 必需和安装 Django 依赖包时的用户一致,nginx 也是一样的。指定nginx 的执行用户,需要在 /etc/nginx/nginx.conf 中修改,将默认的 user www-data; 注释掉,加上 user breky; 就好了,breky 是我部署 Django 的用户。

11.png|图 1:/etc/nginx/nginx.conf 修改后的内容

重启 nginx 服务,再次访问网站,终于好了(某些原因,不能贴图)。

当然,我的项目是个很小的信息检索网站,没有用到后台。如果后台也丢失样式等静态文件,到了这里,原因也就只能是没有执行 python manage.py collectstatic 命令了。

好了,结束了。最后再想几个问题。

三、思考一个问题

处理 nginx 403 Forbidden 时,修改的是 /ect/nginx/nginx.conf 文件,而之前配置 nginx 服务时却是修改的 /etc/nginx/sites-available/default 文件。这两文件怎么联系起的?

查看 nginx.conf 文件,在 http 字段中发现了这么一行:include /etc/nginx/sites-enabled/*;。好了,破案了。以后为了避免不必要的麻烦,可以在其下加一行 include,把自己的目录包含进来,在这个目录里新建个文件,把 default 文件的内容拷贝进来,这样就不用更改 nginx 的文件了。


参考文献

  1. Django+uWSGI+Nginx详细部署过程 By 瞿同学(Darren)
  2. Django项目部署Nginx后静态文件报403 Forbidden状态码 By Daydreamer .

  1. 千峰教育 Django4.2LTS 框架教程的主讲 ↩︎